package org.zf.database.server;


import org.zf.database.consts.DBPrivsType;
import org.zf.database.consts.FieldType;
import org.zf.database.domain.*;
import org.zf.database.exception.NotSupportException;
import org.zf.database.util.DruidUtil;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * 获取数据库信息通用接口
 */
public interface CommonDBServer
{
    /**
     * 获取表空间信息
     *
     * @param dbInfo
     * @return
     * @throws Exception
     */
    List<TableSpaceInfo> getTableSpace(DBInfo dbInfo) throws Exception;

    /**
     * 获取用户列表
     *
     * @param dbInfo 数据库信息
     * @return
     * @throws Exception
     */
    List<String> user(DBInfo dbInfo) throws Exception;

    /**
     * 获取当前数据库中的表信息
     *
     * @param dbInfo 数据库信息
     * @return
     * @throws Exception
     */
    List<TableInfo> table(DBInfo dbInfo) throws Exception;


    /**
     * 查询对某个表的操作权限
     *
     * @param tableInfo
     * @return 1-SELECT 2-UPDATE 4-DELETE
     * @throws Exception
     */
    TablePrivsInfo tablePrivs(TableInfo tableInfo) throws Exception;

    /**
     * 查询数据库权限
     *
     * @param dbInfo
     * @return
     * @throws Exception
     */
    Map<DBPrivsType, Boolean> dbPrivs(DBInfo dbInfo) throws Exception;

    /**
     * 获取表信息统计结果
     *
     * @param dbInfo 数据库信息
     * @return
     * @throws Exception
     */
    TableInfo tableCount(TableInfo dbInfo) throws Exception;

    /**
     * 获取表字段信息
     *
     * @param tableInfo 表信息
     * @return
     * @throws Exception
     */
    List<FieldInfo> cols(TableInfo tableInfo) throws Exception;

    /**
     * 获取jdbc url中的连接信息
     *
     * @param jdbcUrl 连接 url
     * @return
     */
    DBInfo url2DBInfo(String jdbcUrl);

    // url2DBInfo 的逆向方法
    String dbInfo2Url(DBInfo dbInfo);

    // 数据库类型转换
    FieldType convertFieldType(String type) throws NotSupportException;

    FieldType convertFieldType(Map<FieldType, List<String>> TYPEMAP, String type) throws NotSupportException;


    // 替换SQL语句中的特殊字符
    String escapeCharacter(String sql);

    /**
     * 数据库字段操作
     */
    // 通过字段信息获取建表语句
    String getCreateFieldSQL(List<FieldInfo> fieldInfos) throws NotSupportException;

    /**
     * 生成新增字段SQL
     *
     * @param fieldInfo 字段信息 {@link FieldInfo}
     * @return
     * @throws NotSupportException
     */
    String addColumnSql(FieldInfo fieldInfo) throws NotSupportException;

    /**
     * 生成修改字段SQL
     *
     * @param fieldInfo 字段信息 {@link FieldInfo}
     * @return
     * @throws NotSupportException
     */
    String updateColumnSql(FieldInfo fieldInfo) throws NotSupportException;

    /**
     * 删除字段
     *
     * @param fieldInfo 字段信息 {@link FieldInfo}
     * @return
     * @throws NotSupportException
     */
    String delColumnSql(FieldInfo fieldInfo) throws NotSupportException;

    /**
     * 数据库日期转字符串函数构建
     *
     * @param fieldName       字段名
     * @param dateOrTimestamp 日期或时间戳
     * @return 返回数据库函数，如果不是日期类型，直接返回表字段
     */
    String funD2C(String fieldName, boolean dateOrTimestamp);


    /**
     * 数据库字段操作 END
     *
     * @param dbInfo
     * @return
     * @throws Exception
     */
    default Connection getConn(DBInfo dbInfo) throws Exception
    {
        return DruidUtil.getConn(dbInfo);
    }

}
